package com.example.player.util;

import android.media.MediaPlayer;
import android.util.Log;

import com.example.player.domain.entity.Song;

import java.io.IOException;

/**
 * @author 朱文权
 * @date 2025/05/30
 * @description 本类用于管理音乐的播放
 */
public class MediaPlayerHelper {
    //单例player进行播放管理
    private MediaPlayer player=new MediaPlayer();
    //现在正在播放的音乐
    private Song now;
    /**
     * @param song 当前播放的音乐
     * 播放当前播放的音乐，释放上一首音乐的资源
     * */
    public void play(Song song){
        //对上一个音乐资源进行处理
        if(now!=null){
            int status=now.getPlayStatus();
            //判断是否与上次播放的歌曲一致
            if(song.equals(now)){
                //如果歌曲处于暂停状态或者正在播放状态或者播放完毕状态
                if(status==2
                ||status==3
                ||status==4){
                    //继续播放
                    player.start();
                    //设置状态为正在播放
                    song.setPlayStatus(2);
                    return;
                }
                //如果歌曲处于正在加载状态，直接return
                if(status==1){
                    return;
                }
            }
            else {
                //不相同直接释放资源
                now.setPlayStatus(0);
                player.reset();
            }
        }
        now=song;
        //设置音乐源
        try {
            player.setDataSource(song.getPath());
            //准备播放
            song.setPlayStatus(1);
        } catch (IOException e) {
            Log.e("音乐播放","音乐播放失败"+song.getPath());
            //设置未播放状态
            song.setPlayStatus(0);
            throw new RuntimeException(e);
        }
        //异步准备
        player.prepareAsync();
        //设置准备监听器
        player.setOnPreparedListener(mp -> {
            //播放
            mp.start();
            //设置正在播放状态
            song.setPlayStatus(2);
        });
        //设置播放完毕的监听器
        player.setOnCompletionListener(mp->{
            //设置播放完毕状态
            song.setPlayStatus(4);
        });
    }
    /**
     * @param song 需要暂停的音乐
     * @return 是否暂停成功
     * 暂停指定的音乐
     * */
    public boolean pause(Song song){
        int status=song.getPlayStatus();
        //如果音乐处于未播放或加载状态，暂停失败
        if(status==0
        ||status==1){
            Log.e("音乐播放","暂停失败");
            return false;
        }
        if (status==2){
            player.pause();
            song.setPlayStatus(3);
            return true;
        }
        if(status==3||status==4){
            return true;
        }
        //发生未知异常
        Log.e("音乐暂停","音乐暂停发生未知异常"+song.getPath());
        return false;
    }
    /**
     * 释放资源
     * */
    public void release(){
        player.release();
    }
}
